﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RPG_Helper
{
    public class Equipement
    {
        public Equipement(string nom = "")
        { 
            this.m_Nom = nom;
            this.m_ModificationsEquipement = new List<Modification>();
            this.m_EstActif = true;
        }

        public void ajoutModifications(int signe, int valeur, enumerations.ApplicationModification typeModification, enumerations.caracteristique carac)
        { m_ModificationsEquipement.Add(new Modification( typeModification, valeur, (signe > 0), carac)); }

        public Dictionary<enumerations.caracteristique, int> getModifications(Dictionary<enumerations.caracteristique, int> valeursInit)
        {
            Dictionary<enumerations.caracteristique, int> modificationsCarracs = new Dictionary<enumerations.caracteristique, int>();
            if(this.m_EstActif)
            {
                foreach(enumerations.caracteristique carracs in valeursInit.Keys)
                    modificationsCarracs.Add(carracs, 0);

                foreach(Modification modif in this.m_ModificationsEquipement)
                    if(modif.caracteristiqueConcernee == enumerations.caracteristique.Vie || modif.caracteristiqueConcernee == enumerations.caracteristique.Mana) continue;
                    else modificationsCarracs[modif.caracteristiqueConcernee] += modif.valeurFinale(valeursInit[modif.caracteristiqueConcernee]);
            }
            return modificationsCarracs;
        }
        public int getModifVie(int valeurInit)
        {
            int modifVie = 0;
            if(this.m_EstActif)
                foreach(Modification modif in this.m_ModificationsEquipement)
                    if(modif.caracteristiqueConcernee == enumerations.caracteristique.Vie)
                        modifVie += modif.valeurFinale(valeurInit);
            return modifVie;
        }
        public int getModifMana(int valeurInit)
        {
            int modifMana = 0;
            if(this.m_EstActif)
                foreach(Modification modif in this.m_ModificationsEquipement)
                    if(modif.caracteristiqueConcernee == enumerations.caracteristique.Mana)
                        modifMana += modif.valeurFinale(valeurInit);
            return modifMana;
        }


        private List<Modification> m_ModificationsEquipement;
        public string Nom { get { return m_Nom; } set { m_Nom = value; } }
        private string m_Nom;
        public bool EstActif { get { return m_EstActif; } set { m_EstActif = value; } }
        private bool m_EstActif;


        public override string ToString()
        {
            string retour = m_Nom;
            foreach(Modification modif in m_ModificationsEquipement)
                retour += " " + modif.ToString();
            return retour;
        }
        public override bool Equals(object obj)
        {
            if(obj == this) return true;
            if(obj.GetHashCode() == this.GetHashCode()) return true;
            if(obj.GetType() != typeof(Equipement)) return false;
            Equipement e = (Equipement)obj;
            if(e.m_ModificationsEquipement.Count != this.m_ModificationsEquipement.Count) return false;
            if(this.m_EstActif == e.m_EstActif && this.m_Nom == e.m_Nom)
            {
                
                for(int i = 0 ; i < this.m_ModificationsEquipement.Count ; i++)
                    if(!this.m_ModificationsEquipement[i].Equals(e.m_ModificationsEquipement[i])) return false;
                return true;
            }
            return false; 
        }
    };

    public class Modification 
    {
        public Modification(enumerations.ApplicationModification am, int valeur, bool positif, enumerations.caracteristique carac)
        {
            this.m_Signe = (positif ? 1 : -1);
            this.m_Modification = am; m_ValeurModification = valeur;
            this.m_caracteristiqueConcernee = carac;
        }

        public int valeurFinale(int  valeureBrutte) 
        {
            double modif = this.m_Signe;
            if(this.m_Modification == enumerations.ApplicationModification.Directe)
                return (int)(modif*this.m_ValeurModification);
            else
                return (int)(modif*valeureBrutte*this.m_ValeurModification/100);
        }

        public override string ToString()
        { return (m_Signe > 0 ? "+" : "-") + m_ValeurModification + (m_Modification == enumerations.ApplicationModification.Pourcentage ? "%" : ""); }
        public override bool Equals(object obj)
        {
            if(obj == this) return true;
            if(obj.GetHashCode() == this.GetHashCode()) return true;
            if(obj.GetType() != typeof(Modification)) return false;
            Modification m = (Modification)obj;
            return (m.m_caracteristiqueConcernee == this.m_caracteristiqueConcernee && m.m_Modification == this.m_Modification &&
                    m.m_Signe == this.m_Signe && m.m_ValeurModification == this.m_ValeurModification);

        }

        private int m_ValeurModification;
        private int m_Signe;
        private enumerations.ApplicationModification m_Modification;
        private enumerations.caracteristique m_caracteristiqueConcernee;
        public enumerations.caracteristique caracteristiqueConcernee { get { return this.m_caracteristiqueConcernee; } }
    };

}
